/*     */ package com.zimbra.cs.lmtpserver;
/*     */ 
/*     */ import java.io.PrintStream;
/*     */ import java.util.HashMap;
/*     */ import java.util.Map;
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ public class LmtpAddress
/*     */ {
/*     */   private boolean mIsValid;
/*     */   private String mLocalPart;
/*     */   private String mNormalizedLocalPart;
/*     */   private String mDomainPart;
/*     */   private Map<String, String> mParameters;
/*     */   private LmtpReply mDeliveryReply;
/*     */   private String mEmailAddress;
/*     */   private String[] mAllowedParameters;
/*  34 */   private boolean mSkipFilters = false;
/*  35 */   private String mFolder = null;
/*  36 */   private String mFlags = null;
/*  37 */   private String[] mTags = null;
/*     */   
/*  39 */   private boolean mOnLocalServer = true;
/*     */   private String mRemoteServer;
/*     */   private int offset;
/*     */   
/*  43 */   public LmtpAddress(String arg, String[] allowedParameters, String rcptDelim) { this.mAllowedParameters = allowedParameters;
/*  44 */     this.mParameters = new HashMap();
/*  45 */     this.mIsValid = parse(arg);
/*  46 */     this.mDeliveryReply = LmtpReply.TEMPORARY_FAILURE;
/*     */     
/*  48 */     if (!this.mIsValid) {
/*  49 */       return;
/*     */     }
/*     */     
/*  52 */     int delimIndex = -1;
/*  53 */     if ((this.mLocalPart != null) && (rcptDelim != null) && ((delimIndex = this.mLocalPart.indexOf(rcptDelim)) > 0))
/*     */     {
/*     */ 
/*  56 */       this.mNormalizedLocalPart = this.mLocalPart.substring(0, delimIndex);
/*     */     } else {
/*  58 */       this.mNormalizedLocalPart = this.mLocalPart;
/*     */     }
/*     */     
/*  61 */     int l1 = this.mLocalPart != null ? this.mLocalPart.length() : 0;
/*  62 */     int l2 = this.mDomainPart != null ? this.mDomainPart.length() : 0;
/*  63 */     StringBuilder sb = new StringBuilder(l1 + l2 + 1);
/*  64 */     if (this.mNormalizedLocalPart != null) {
/*  65 */       sb.append(this.mNormalizedLocalPart);
/*     */     }
/*  67 */     if (this.mDomainPart != null) {
/*  68 */       sb.append("@").append(this.mDomainPart);
/*     */     }
/*  70 */     this.mEmailAddress = sb.toString();
/*     */   }
/*     */   
/*     */   public void setSkipFilters(boolean skip) {
/*  74 */     this.mSkipFilters = skip;
/*     */   }
/*     */   
/*     */   public boolean getSkipFilters() {
/*  78 */     return this.mSkipFilters;
/*     */   }
/*     */   
/*     */   public void setFolder(String folder) {
/*  82 */     this.mFolder = folder;
/*     */   }
/*     */   
/*     */   public String getFolder() {
/*  86 */     return this.mFolder;
/*     */   }
/*     */   
/*     */   public void setFlags(String flags) {
/*  90 */     this.mFlags = flags;
/*     */   }
/*     */   
/*     */   public String getFlags() {
/*  94 */     return this.mFlags;
/*     */   }
/*     */   
/*     */   public void setTags(String[] tags) {
/*  98 */     this.mTags = tags;
/*     */   }
/*     */   
/*     */   public String[] getTags() {
/* 102 */     return this.mTags;
/*     */   }
/*     */   
/*     */   public String getEmailAddress() {
/* 106 */     return this.mEmailAddress;
/*     */   }
/*     */   
/*     */   public String getLocalPart() {
/* 110 */     return this.mLocalPart;
/*     */   }
/*     */   
/*     */   public String getNormalizedLocalPart() {
/* 114 */     return this.mNormalizedLocalPart;
/*     */   }
/*     */   
/*     */   public String getDomainPart() {
/* 118 */     return this.mDomainPart;
/*     */   }
/*     */   
/*     */   public boolean isValid() {
/* 122 */     return this.mIsValid;
/*     */   }
/*     */   
/*     */   public Map<String, String> getParameters() {
/* 126 */     return this.mParameters;
/*     */   }
/*     */   
/*     */   public String getParameter(String key) {
/* 130 */     if (this.mParameters.isEmpty()) {
/* 131 */       return null;
/*     */     }
/* 133 */     return (String)this.mParameters.get(key.toUpperCase());
/*     */   }
/*     */   
/*     */   public LmtpReply getDeliveryStatus() {
/* 137 */     return this.mDeliveryReply;
/*     */   }
/*     */   
/*     */   public void setDeliveryStatus(LmtpReply reply) {
/* 141 */     this.mDeliveryReply = reply;
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   private int length;
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */   private char[] array;
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */   private static final boolean debug = false;
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */   private static void say(String s)
/*     */   {
/* 166 */     System.out.println("  [debug] " + s);
/*     */   }
/*     */   
/*     */   private boolean eos() {
/* 170 */     return this.offset >= this.length;
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */   private int next()
/*     */   {
/* 177 */     if (this.offset < this.length) {
/* 178 */       return this.array[(this.offset++)];
/*     */     }
/* 180 */     return -1;
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   private int peek()
/*     */   {
/* 192 */     if (this.offset < this.length) {
/* 193 */       return this.array[this.offset];
/*     */     }
/* 195 */     return -1;
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   private void skip()
/*     */   {
/* 206 */     this.offset += 1;
/*     */   }
/*     */   
/*     */   private void init(String p)
/*     */   {
/* 211 */     this.array = p.toCharArray();
/* 212 */     this.length = this.array.length;
/* 213 */     this.offset = 0;
/*     */   }
/*     */   
/*     */   private boolean parse(String p)
/*     */   {
/* 218 */     if ((p == null) || (p.length() < 2))
/*     */     {
/* 220 */       return false;
/*     */     }
/*     */     
/* 223 */     init(p);
/*     */     
/*     */ 
/* 226 */     skipSpaces();
/*     */     
/*     */ 
/* 229 */     int ch = next();
/* 230 */     if ((ch == -1) || (ch != 60))
/*     */     {
/* 232 */       return false;
/*     */     }
/*     */     
/*     */ 
/* 236 */     if (!skipSourceRoutes())
/*     */     {
/* 238 */       return false;
/*     */     }
/*     */     
/*     */ 
/* 242 */     if (!parseLocalPart())
/*     */     {
/* 244 */       return false;
/*     */     }
/*     */     
/*     */ 
/* 248 */     ch = peek();
/* 249 */     if ((ch == 64) && (!parseDomainPart()))
/*     */     {
/* 251 */       return false;
/*     */     }
/*     */     
/*     */ 
/* 255 */     ch = next();
/* 256 */     if (ch != 62)
/*     */     {
/* 258 */       return false;
/*     */     }
/*     */     
/*     */ 
/* 262 */     if (eos())
/*     */     {
/* 264 */       return true;
/*     */     }
/*     */     
/* 267 */     ch = peek();
/* 268 */     if (ch != 32)
/*     */     {
/* 270 */       return false;
/*     */     }
/*     */     
/*     */ 
/* 274 */     skipSpaces();
/*     */     
/*     */ 
/* 277 */     while (!eos()) {
/* 278 */       if (!parseParameter())
/*     */       {
/* 280 */         return false;
/*     */       }
/* 282 */       skipSpaces();
/*     */     }
/*     */     
/* 285 */     return true;
/*     */   }
/*     */   
/*     */   private void skipSpaces()
/*     */   {
/* 290 */     while (peek() == 32) { skip();
/*     */     }
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   private boolean skipSourceRoutes()
/*     */   {
/* 305 */     int ch = peek();
/* 306 */     if (ch != 64)
/*     */     {
/* 308 */       return true;
/*     */     }
/* 310 */     skip();
/*     */     
/* 312 */     while (ch == 64) {
/* 313 */       ch = peek();
/* 314 */       if (ch == 91) {
/* 315 */         if (!skipAddress())
/*     */         {
/* 317 */           return false;
/*     */         }
/*     */       }
/* 320 */       else if (!skipHostname())
/*     */       {
/* 322 */         return false;
/*     */       }
/*     */       
/*     */ 
/* 326 */       ch = next();
/* 327 */       if (ch == 44) {
/* 328 */         ch = next();
/*     */ 
/*     */       }
/* 331 */       else if (ch == 58) {
/* 332 */         ch = peek();
/* 333 */         if (ch == 64)
/*     */         {
/* 335 */           skip();
/*     */         }
/*     */         
/*     */ 
/*     */       }
/*     */       else
/*     */       {
/* 342 */         return false;
/*     */       }
/*     */     }
/*     */     
/*     */ 
/* 347 */     return true;
/*     */   }
/*     */   
/*     */   private boolean isDigit(int c) {
/* 351 */     return (c >= 48) && (c <= 57);
/*     */   }
/*     */   
/*     */   private boolean isLetter(int c) {
/* 355 */     return ((c >= 97) && (c <= 122)) || ((c >= 65) && (c <= 90));
/*     */   }
/*     */   
/*     */   private boolean skipAddress()
/*     */   {
/* 360 */     int ch = next();
/* 361 */     if (ch != 91)
/*     */     {
/* 363 */       return false;
/*     */     }
/*     */     do
/*     */     {
/* 367 */       ch = next();
/* 368 */     } while ((isDigit(ch)) || (ch == 46));
/*     */     
/* 370 */     if (ch != 93)
/*     */     {
/* 372 */       return false;
/*     */     }
/*     */     
/*     */ 
/* 376 */     return true;
/*     */   }
/*     */   
/*     */   private boolean skipHostname()
/*     */   {
/*     */     for (;;) {
/* 382 */       int ch = peek();
/* 383 */       if ((!isDigit(ch)) && (!isLetter(ch)) && (ch != 46) && (ch != 45)) break;
/* 384 */       skip();
/*     */     }
/*     */     
/*     */ 
/*     */ 
/*     */ 
/* 390 */     return true;
/*     */   }
/*     */   
/*     */   private boolean parseLocalPart()
/*     */   {
/* 395 */     int ch = peek();
/* 396 */     if (ch == 34) {
/* 397 */       return parseQuotedLocalPart();
/*     */     }
/* 399 */     return parsePlainLocalPart();
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */   private boolean parseQuotedLocalPart()
/*     */   {
/* 406 */     int ch = next();
/* 407 */     if (ch != 34)
/*     */     {
/* 409 */       return false;
/*     */     }
/*     */     
/* 412 */     int soffset = this.offset;
/* 413 */     while (!eos()) {
/* 414 */       ch = next();
/* 415 */       if (ch == 92) {
/* 416 */         ch = next();
/* 417 */         if (ch == -1)
/*     */         {
/* 419 */           return false;
/*     */         }
/* 421 */       } else if (ch == 34)
/*     */       {
/* 423 */         this.mLocalPart = new String(this.array, soffset, this.offset - 1 - soffset);
/*     */         
/* 425 */         this.mLocalPart = decodeQuotedPairs(this.mLocalPart);
/*     */         
/* 427 */         return true;
/*     */       }
/*     */     }
/*     */     
/*     */ 
/* 432 */     return false;
/*     */   }
/*     */   
/*     */   private static String decodeQuotedPairs(String s) {
/* 436 */     StringBuilder sb = new StringBuilder(s);
/* 437 */     int i = 0;
/* 438 */     while (i < sb.length()) {
/* 439 */       if ('\\' == sb.charAt(i)) {
/* 440 */         sb.deleteCharAt(i);
/*     */       }
/* 442 */       i++;
/*     */     }
/* 444 */     return sb.toString();
/*     */   }
/*     */   
/*     */   private boolean parsePlainLocalPart()
/*     */   {
/* 449 */     int soffset = this.offset;
/*     */     
/* 451 */     while (!eos()) {
/* 452 */       int ch = peek();
/*     */       
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/* 462 */       if ((ch < 33) || (ch > 126))
/*     */       {
/* 464 */         return false;
/*     */       }
/*     */       
/* 467 */       if ("<()[]\\,;:\"".indexOf(ch) > -1)
/*     */       {
/*     */ 
/*     */ 
/*     */ 
/* 472 */         return false;
/*     */       }
/*     */       
/* 475 */       if ((ch == 64) || (ch == 62)) {
/* 476 */         this.mLocalPart = new String(this.array, soffset, this.offset - soffset);
/*     */         
/* 478 */         return true;
/*     */       }
/*     */       
/* 481 */       skip();
/*     */     }
/*     */     
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/* 488 */     this.mLocalPart = new String(this.array, soffset, this.offset - soffset);
/*     */     
/* 490 */     return true;
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */   private boolean parseDomainPart()
/*     */   {
/* 498 */     int ch = next();
/* 499 */     if (ch != 64) {
/* 500 */       return false;
/*     */     }
/*     */     
/* 503 */     int soffset = this.offset;
/*     */     
/* 505 */     ch = peek();
/* 506 */     if (ch == 91) {
/* 507 */       if (!skipAddress()) {
/* 508 */         return false;
/*     */       }
/*     */     }
/* 511 */     else if (!skipHostname()) {
/* 512 */       return false;
/*     */     }
/*     */     
/*     */ 
/* 516 */     this.mDomainPart = new String(this.array, soffset, this.offset - soffset);
/* 517 */     return true;
/*     */   }
/*     */   
/*     */ 
/*     */   private boolean parseParameter()
/*     */   {
/* 523 */     String key = null;
/* 524 */     int koffset = this.offset;
/* 525 */     while (!eos()) {
/* 526 */       int ch = next();
/* 527 */       if (ch == 61) {
/* 528 */         key = new String(this.array, koffset, this.offset - koffset - 1);
/* 529 */         if (allowedParameter(key)) {
/*     */           break;
/*     */         }
/* 532 */         return false;
/*     */       }
/*     */     }
/*     */     
/* 536 */     if (key == null)
/*     */     {
/* 538 */       return false;
/*     */     }
/*     */     
/* 541 */     int voffset = this.offset;
/*     */     for (;;) {
/* 543 */       int ch = peek();
/* 544 */       if ((ch == -1) || (ch == 32)) {
/*     */         break;
/*     */       }
/* 547 */       skip();
/*     */     }
/* 549 */     String value = new String(this.array, voffset, this.offset - voffset);
/* 550 */     this.mParameters.put(key.toUpperCase(), value);
/*     */     
/* 552 */     return true;
/*     */   }
/*     */   
/*     */   private boolean allowedParameter(String key) {
/* 556 */     if (this.mAllowedParameters == null)
/*     */     {
/* 558 */       return false;
/*     */     }
/*     */     
/* 561 */     for (int i = 0; i < this.mAllowedParameters.length; i++)
/*     */     {
/* 563 */       if (key.equalsIgnoreCase(this.mAllowedParameters[i]))
/*     */       {
/* 565 */         return true;
/*     */       }
/*     */     }
/*     */     
/* 569 */     return false;
/*     */   }
/*     */   
/*     */   public String toString() {
/* 573 */     return this.mEmailAddress;
/*     */   }
/*     */   
/*     */   public boolean isOnLocalServer() {
/* 577 */     return this.mOnLocalServer;
/*     */   }
/*     */   
/*     */   public void setOnLocalServer(boolean onLocalServer) {
/* 581 */     this.mOnLocalServer = onLocalServer;
/*     */   }
/*     */   
/*     */   public String getRemoteServer() {
/* 585 */     return this.mRemoteServer;
/*     */   }
/*     */   
/*     */   public void setRemoteServer(String remoteServer) {
/* 589 */     this.mRemoteServer = remoteServer;
/*     */   }
/*     */ }


/* Location:              /home/mint/zimbrastore.jar!/com/zimbra/cs/lmtpserver/LmtpAddress.class
 * Java compiler version: 7 (51.0)
 * JD-Core Version:       0.7.1
 */